
/* $Id: messaggi.c 9 2009-12-29 12:25:52Z calicant $ */


#ifdef AMIGA
#include <proto/locale.h>
#include <libraries/locale.h>
#define CATCOMP_NUMBERS
#define CATCOMP_ARRAY
#endif

#include "edilana.h"

#ifdef AMIGA
extern struct Catalog *catalog;
#endif

STRPTR GetCatStr (LONG id) {

        long size = sizeof (CatCompArray) / sizeof (CatCompArray [0]);
        LONG left = 0, right = size - 1, middle;

        while (left <= right) {
                middle = (left + right) / 2;
                if (id > CatCompArray [middle].cca_ID) { left = middle + 1; }
                else if (id < CatCompArray [middle].cca_ID) { right = middle - 1; }
                else {
                        if (ILocale)
                        	return (STRPTR) ILocale->GetCatalogStr (catalog, id, (STRPTR) CatCompArray [middle].cca_Str);
                        return (STRPTR) CatCompArray [middle].cca_Str;
                }
        }
        return "N/A";
}


/*
#ifdef __MSDOS__
#include "Edil_rev.h"
#else
*/

#include "EdilAna_rev.h"   /* inclusione del file di revisione */

/*#endif*/

#define COPYRIGHT GetCatStr(MSG_COPYRIGHT)
#define USO GetCatStr(MSG_USE)

/*---------- numero messaggi di help su comandi */
#define NCOM    (sizeof HelpMsg / sizeof HelpMsg[0])

/*---------- numero messaggi di errore */
#define NMSG    (sizeof Messaggio / sizeof Messaggio[0])

/*
 * Stampa la stringa d'uso e qualche altra informazione
 */
void Version (void)
{

    fprintf(stderr,
			"%s, %s, %s\n%s\n", VERS, DATE, COPYRIGHT, USO);
    exit(0);
}

/*
 *  Stampa informazioni per l'utilizzo dei comandi
 */
void Help (char *sott, char *c)
{

    #ifdef AMIGA
    StampaFast(ON);
    #endif

    switch(sott[1]) {
    /* stampa informazioni sull'utilizzo dei tasti */
    case 't':
    	fprintf(stdout,
			"\n%s\n\n%s%s%s%s%s%s%s%s%s%s%s%s\n",		
    	    GetCatStr(MSG_KEY_SHORTCUT),
        	GetCatStr(MSG_KEY_MOVE),
    	    GetCatStr(MSG_KEY_UP_DOWN),
			GetCatStr(MSG_KEY_BOL_EOL),
			GetCatStr(MSG_KEY_BOW_EOW),
			GetCatStr(MSG_KEY_BS),
			GetCatStr(MSG_KEY_DEL_RIGHT),
			GetCatStr(MSG_KEY_DEL_LDE),
			GetCatStr(MSG_KEY_DEL_CURRPOS),
			GetCatStr(MSG_KEY_HB_TOP_BOTTOM), 
			GetCatStr(MSG_KEY_HB_FIND),
			GetCatStr(MSG_KEY_WC),
			GetCatStr(MSG_KEY_WC_ALL)
    );
    break;

    /* stampa help sull'editing */
    case 'e':
		fprintf(stdout, "\n%s\n\n", GetCatStr(MSG_EDIT_COMMANDS));
		fprintf(stdout, GetCatStr(MSG_EDIT_BEGIN), c[WILD_CANDI]);
		fprintf(stdout, GetCatStr(MSG_EDIT_COMPL), c[WILD_CANDI]);
		fprintf(stdout, GetCatStr(MSG_EDIT_DIFF), c[WILD_RESTO]);
		fprintf(stdout, GetCatStr(MSG_EDIT_ADD), c[AGGIUNGI], c[AGGIUNGI]);
		fprintf(stdout, GetCatStr(MSG_EDIT_NO_SPACE), c[AGGIUNGI], c[AGGIUNGI]);
		fprintf(stdout, GetCatStr(MSG_EDIT_REMOVE), c[TOGLI]);
		fprintf(stdout, GetCatStr(MSG_EDIT_SUBST), c[SOSTITUISCI]);
		fprintf(stdout, GetCatStr(MSG_EDIT_SUBST_CHAR), c[SOSTITUISCI]);
		fprintf(stdout, GetCatStr(MSG_EDIT_SUBST_WORD), c[SOSTITUISCI], c[SOSTITUISCI]);
		fprintf(stdout, GetCatStr(MSG_EDIT_WORD_FIX), c[FISSA_LEMMA]);
		fprintf(stdout, GetCatStr(MSG_EDIT_WORD_FREE), c[FISSA_LEMMA]);
		fprintf(stdout, GetCatStr(MSG_EDIT_REDO), c[UNDO]);
    break;

    /* stampa help sul logfile */
    case 'l':
		fprintf(stdout, "\n%s\n\n", GetCatStr(MSG_LOG_COMMANDS));
		fprintf(stdout, GetCatStr(MSG_LOG_VIEW), c[NUOVO_LOG]);
		fprintf(stdout, GetCatStr(MSG_LOG_FIND), c[VEDI_IN_LOG]);
		fprintf(stdout, GetCatStr(MSG_LOG_ANAG_START), c[VEDI_IN_LOG]);
		fprintf(stdout, GetCatStr(MSG_LOG_ANAG_IN), c[VEDI_IN_LOG], c[VEDI_IN_LOG]);
		fprintf(stdout, GetCatStr(MSG_LOG_VIEWNAMES), c[VEDI_IN_LOG], c[VEDI_IN_LOG]);
		fprintf(stdout, GetCatStr(MSG_LOG_NEW_BASE), c[VEDI_IN_LOG], c[VEDI_IN_LOG], c[VEDI_IN_LOG]);
		fprintf(stdout, GetCatStr(MSG_LOG_ANAG_SAVE), c[ANAG_IN_LOG]);
		fprintf(stdout, GetCatStr(MSG_LOG_COMMENT_SAVE), c[COMMENTO_LOG]);
		fprintf(stdout, GetCatStr(MSG_LOG_CHANGE), c[NUOVO_LOG], c[NUOVO_LOG]);
		fprintf(stdout, GetCatStr(MSG_VOCAB_CHANGE), c[NUOVO_VOC]);
		fprintf(stdout, GetCatStr(MSG_VOCAB_LEMMA_ADD), c[NUOVO_LEMMA]);
		fprintf(stdout, GetCatStr(MSG_VOCAB_LEMMA_REMOVE), c[NUOVO_LEMMA], c[NUOVO_LEMMA]);
    break;

	/* stampa help sulle candidate */
    case 'c':
		fprintf(stdout, "\n%s\n\n", GetCatStr(MSG_CANDI_COMMANDS));
		fprintf(stdout, GetCatStr(MSG_CANDI_VIEW), c[VEDI_CAND]);
		fprintf(stdout, GetCatStr(MSG_CANDI_VIEW_MINLEN), c[VEDI_CAND]);
		fprintf(stdout, GetCatStr(MSG_CANDI_VIEW_STARTWITH), c[VEDI_CAND]);
		fprintf(stdout, GetCatStr(MSG_CANDI_VIEW_WITHDIFF), c[VEDI_CAND], c[VEDI_CAND]);
		fprintf(stdout, GetCatStr(MSG_CANDI_VIEW_MATCH), c[VEDI_CAND], c[VEDI_CAND]);
		fprintf(stdout, GetCatStr(MSG_CANDI_VIEW_DIFF_MATCH), c[VEDI_CAND]);
		fprintf(stdout, GetCatStr(MSG_CANDI_SECOND_VOC_FIND), c[SUL_RESTO]);
		fprintf(stdout, GetCatStr(MSG_CANDI_SECOND_VOC_FIND_MINLEN), c[SUL_RESTO]);
		fprintf(stdout, GetCatStr(MSG_CANDI_VIEW_RESULTS), c[SUL_RESTO], c[SUL_RESTO]);
		fprintf(stdout, GetCatStr(MSG_CANDI_RADIX_SEARCH), c[CANDY], c[CANDY], c[CANDY]);
		fprintf(stdout, GetCatStr(MSG_CANDI_RADIX_SEARCH_TRUNCATE), c[CANDY]);
		fprintf(stdout, GetCatStr(MSG_CANDI_RADIX_SEARCH_MINLEN), c[CANDY]);
		fprintf(stdout, GetCatStr(MSG_CANDI_VIEW_RADIX), c[CANDY]);
		fprintf(stdout, GetCatStr(MSG_CANDI_VIEW_RADIX_DIFF), c[CANDY], c[CANDY]);
		fprintf(stdout, GetCatStr(MSG_CANDI_VIEW_RADIX_STARTWITH), c[CANDY]);
		fprintf(stdout, GetCatStr(MSG_CANDI_VIEW_RADIX_MATCH), c[CANDY], c[CANDY]);
		fprintf(stdout, GetCatStr(MSG_CANDI_RADIX_CANDI_DIFF), c[CANDY]);
		fprintf(stdout, GetCatStr(MSG_CANDI_RADIX_CANDI_DIFF_MATCH), c[CANDY]);
		fprintf(stdout, GetCatStr(MSG_CANDI_PRINT_N_M), c[CANDY], c[VEDI_VAR]);
		fprintf(stdout, GetCatStr(MSG_CANDI_MERGE), c[CANDY], c[VEDI_CAND]);
    break;

    /* help comandi nome */
    case 'n':
		fprintf(stdout, "\n%s\n\n", GetCatStr(MSG_NAME_COMMANDS));
		fprintf(stdout, GetCatStr(MSG_NAME_NEWBASE), c[NUOVA_BASE]);
		fprintf(stdout, GetCatStr(MSG_NAME_NEWBASE_FROMLIST), c[LISTA_NOMI]);
		fprintf(stdout, GetCatStr(MSG_NAME_VIEWLIST), c[LISTA_NOMI]);
		fprintf(stdout, GetCatStr(MSG_NAME_VIEWLIST_STARTWITH), c[LISTA_NOMI]);
		fprintf(stdout, GetCatStr(MSG_NAME_LIST_LOAD), c[LISTA_NOMI], c[LISTA_NOMI]);
		fprintf(stdout, GetCatStr(MSG_NAME_VIEWLIST_ANAG), c[NOMI_BUONI]);
		fprintf(stdout, GetCatStr(MSG_NAME_RESULTS), c[NOMI_BUONI], c[NOMI_BUONI]);
    break;

    /* help anagrammi */
    case 'a':
		fprintf(stdout, "\n%s\n\n", GetCatStr(MSG_ANAG_COMMANDS));
		fprintf(stdout, GetCatStr(MSG_ANAG_AUTO), c[ANAGRAMMA]);
		fprintf(stdout, GetCatStr(MSG_ANAG_ALIAS), c[ANAGRAMMA], c[ANAGRAMMA]);
		fprintf(stdout, GetCatStr(MSG_ANAG_ALIAS_DIFF), c[ANAGRAMMA]);
		fprintf(stdout, GetCatStr(MSG_ANAG_EXT_CMD), c[AUTO_ANAG]);
		fprintf(stdout, GetCatStr(MSG_ANAG_RESULTS), c[ANAGRAMMA]);
		fprintf(stdout, GetCatStr(MSG_ANAG_RESULTS_MATCH), c[ANAGRAMMA]);
    break;

    /* help variabili programma */
    case 's':
		fprintf(stdout, "\n%s\n\n", GetCatStr(MSG_VARS_COMMANDS));
		fprintf(stdout, GetCatStr(MSG_VARS_PRINT), c[VEDI_VAR]);
		fprintf(stdout, GetCatStr(MSG_VARS_SHOW_DIFF_CANDI), c[AUTO_RESTO]);
		fprintf(stdout, GetCatStr(MSG_VARS_SHOW_DIFF_DIFF_CANDI), c[AUTO_RESTO]);
		fprintf(stdout, GetCatStr(MSG_VARS_DIFF_PERM), c[AUTO_RESTO]);
		fprintf(stdout, GetCatStr(MSG_VARS_TOGGLE), c[AUTO_RESTO]);
		fprintf(stdout, GetCatStr(MSG_VARS_LOG_SAVE_TIMESTAMP), c[AUTO_RESTO]);
		fprintf(stdout, GetCatStr(MSG_VARS_PROMPT_TIME), c[AUTO_RESTO]);
		fprintf(stdout, GetCatStr(MSG_VARS_AUTOCANDI), c[AUTO_RESTO]);
		fprintf(stdout, GetCatStr(MSG_VARS_FORCE_DIFF_PERM), c[AUTO_RESTO]);
    break;

    default:
        printf(GetCatStr(MSG_MAIN_HEADER), VSTRING, __DATE__, __TIME__);

		fprintf(stdout, GetCatStr(MSG_MAIN_SUB_HELP), c[AIUTO]);
		fprintf(stdout, "%s%s%s%s%s%s%s\n",
 			GetCatStr(MSG_MAIN_EDIT),
			GetCatStr(MSG_MAIN_NAMES),
			GetCatStr(MSG_MAIN_LOGFILE),
			GetCatStr(MSG_MAIN_CANDI),
			GetCatStr(MSG_MAIN_ANAGS),
			GetCatStr(MSG_MAIN_SETTINGS),
			GetCatStr(MSG_MAIN_KEYS));
		fprintf(stdout, GetCatStr(MSG_MAIN_EXT_COMMAND), c[CMD_EXT]);
		fprintf(stdout, GetCatStr(MSG_MAIN_QUIT), c[USCITA]);
		fprintf(stdout, GetCatStr(MSG_MAIN_QUIT_STATS), c[USCITA], c[USCITA]);
		fprintf(stdout, GetCatStr(MSG_MAIN_HELP), c[AIUTO]);
    break;
    }

    #ifdef AMIGA
    StampaFast(OFF);
    #endif
}

/*
 *  Stampa dei messaggi d'errore
 */
void IoDico (int questo)
{
	fprintf(stderr, " *** %s\n", GetCatStr(questo));
}

void StampaAuguri (void)
{
/*
static char aug[] = {66, 32, 85, 32, 79, 32, 78, 32, 69, 32, 32, 32,
            70, 32, 69, 32, 83, 32, 84, 32, 69, 0};
*/

int i;

    printf("\n\n%49s\n\n%39s\n", GetCatStr(MSG_HAPPY_HOLIDAYS), "*");
    for (i = 0; i < 7; i++)
        printf("%*s%.*s\n", 38-i, "", i*2+1, "%%%%%%%%%%%%%");
    printf("%40s\n\n", "|_|");

}

void printTotCandi (char *s, int n) {

	if (s[0] == '\0')
   		fprintf(stdout, GetCatStr(PRINT_N_FOUND_1),
        	n,
			n <= 1 ? GetCatStr(SINGLE_CANDI_SUFFIX) : GetCatStr(MULTI_CANDI_SUFFIX)
		);
	else
   		fprintf(stdout, GetCatStr(PRINT_N_FOUND_2),
        	s,
        	n,
			n <= 1 ? GetCatStr(SINGLE_CANDI_SUFFIX) : GetCatStr(MULTI_CANDI_SUFFIX)
    	);
}

void printStats (int dataEntrata[], int stat[], int ore, int min) {

	fprintf(stdout,
				GetCatStr(MSG_STATS_TIME),
                dataEntrata[0],dataEntrata[1],dataEntrata[2],
		dataEntrata[3],dataEntrata[4]
	);

	if (ore > 0) fprintf(stdout, GetCatStr(MSG_STATS_TIME_1), ore,ore > 1 ? GetCatStr(MSG_STATS_HOUR_MULTI) : GetCatStr(MSG_STATS_HOUR_SINGLE));
	if (min > 0) fprintf(stdout, GetCatStr(MSG_STATS_TIME_2), min,min > 1 ? GetCatStr(MSG_STATS_MINUTE_MULTI) : GetCatStr(MSG_STATS_MINUTE_SINGLE));
	if (ore == 0 && min == 0) {
		fprintf(stdout, GetCatStr(MSG_STATS_TIME_3));
		/* evitiamo un overflow (cfr. infra) */
		min++;
	}

	fprintf(stdout,
		GetCatStr(MSG_STATS),
		stat[0],
		stat[3],stat[1],
		stat[2],
		(unsigned long)((stat[0]*1000)/(ore*60+min))
	);
}

void printSubError () {
	printf(" *** %s ", GetCatStr(TOO_MANY_LETTERS));
}
